﻿// owner 蒋家伟

#pragma once

#include <QString>
#include <mutex>

namespace jsdk 
{
    // 描述 ：单例模式，用于记录程序运行过程中的日志
    class Log
    {
    public:
        // 日志等级
        enum eLogLevel
        {
            eLogLevelNormal = 0,
            eLogLevelWarning,
            eLogLevelError,
            eLogLevelCount,
        };

        // 获取该类的全局唯一实例
        static Log& getInstance();

        // 设置软件名称
        void setSoftName(const QString& softName);

        // 获取软件名称
        const QString& getSoftName() const;

        // 设置软件版本
        void setSoftVersion(const QString& softVersion);

        // 获取软件版本
        const QString& getSoftVersion() const;

        // 设置日志文件所在的目录
        void setDir(const QString& dir);

        // 写入日志
        void log(eLogLevel level, const std::wstring& msg);
    private:
        Log(void);
        ~Log(void);

    private:
        QString      m_sDir = u8"./Log";                    // 日志目录
        std::mutex   m_mutexSerialize;                      // 互斥锁，用于同步，防止多个线程同时对日志文件进行操作
        QString      m_sLogLevel[eLogLevelCount];           // 表征日志等级的字符串
        QString      m_softName;                            // 软件名称
        QString      m_softVersion;                         // 软件版本
    };
}  // namespace jsdk

#define LOG_DIR_(dir)        (jsdk::Log::getInstance().setDir(dir))
#define LOG_NORMAL_(msg)     (jsdk::Log::getInstance().log(jsdk::Log::eLogLevelNormal, msg))
#define LOG_WARNING_(msg)    (jsdk::Log::getInstance().log(jsdk::Log::eLogLevelWarning, msg))
#define LOG_ERROR_(msg)      (jsdk::Log::getInstance().log(jsdk::Log::eLogLevelError, msg))
